#include <CoreServices/CoreServices.h>
#include <sys/param.h>
#include <unistd.h>
static OSStatus FSSetCatalogInfoIDs(const FSRef *ref,
FSCatalogInfoBitmap whichInfo,
const FSCatalogInfo *catalogInfo)
// kFSCatInfoPermissions フラグを渡す場合に FUID と FGID
// を実際に設定しようとする FSSetCatalogInfo の一例。これは、
// <rdar://problem/2631025> のための回避策として
// 現在推奨されている。userID または groupID の値として -1
// を渡すことにより、値の変更を希望しないことを指定できる。
{
OSStatus err;
const FSPermissionInfo * permInfo;
uid_t uid;
gid_t gid;
err = FSSetCatalogInfo(ref, whichInfo, catalogInfo);
if ( (err == noErr) && (whichInfo & kFSCatInfoPermissions) ) {
permInfo = (const FSPermissionInfo *) catalogInfo->permissions;
uid = (uid_t) permInfo->userID;
gid = (gid_t) permInfo->groupID;
if (uid != -1 || gid != -1 ) {
char filePath[MAXPATHLEN];
err = FSRefMakePath(ref, (UInt8 *) filePath, sizeof(filePath));
if (err == noErr) {
err = chown(filePath, uid, gid);
if (err == -1) {
err = errno;
}
}
}
}
return err;
}
|